package com.oh.client;

import com.oh.core.common.constant.CommandEnum;
import com.oh.core.common.constant.SerializationAlgorithm;
import com.oh.core.common.utils.MessageUtils;
import com.oh.core.entity.HeadInfo;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 原始包问，消息头和消息体
 * 1-1 指令
 * 2-4 魔数
 * 3-4 报文长度
 * 4 报文体
 */
public class Client {

    public static void main(String[] args) throws Exception {
        String context = "古之学者必有师。师者，所以传道受业解惑也。人非生而知之者，孰能无惑？惑而不从师，其为惑也，终不解矣。" +
                "生乎吾前，其闻道也固先乎吾，吾从而师之；生乎吾后，其闻道也亦先乎吾，吾从而师之。吾师道也，夫庸知其年之先后生于吾乎？" +
                "是故无贵无贱，无长无少，道之所存，师之所存也。嗟乎！师道之不传也久矣！欲人之无惑也难矣！古之圣人，其出人也远矣，犹且从师而问焉；" +
                "今之众人，其下圣人也亦远矣，而耻学于师。是故圣益圣，愚益愚。圣人之所以为圣，愚人之所以为愚，其皆出于此乎？爱其子，择师而教之；" +
                "于其身也，则耻师焉，惑矣。彼童子之师，授之书而习其句读者，非吾所谓传其道解其惑者也。句读之不知，惑之不解，或师焉，或不焉，" +
                "小学而大遗，吾未见其明也。巫医乐师百工之人，不耻相师。士大夫之族，曰师曰弟子云者，则群聚而笑之。问之，则曰：“彼与彼年相若也，" +
                "道相似也。位卑则足羞，官盛则近谀。”呜呼！师道之不复可知矣。巫医乐师百工之人，君子不齿，今其智乃反不能及，其可怪也欤！圣人无常师。" +
                "孔子师郯子、苌弘、师襄、老聃。郯子之徒，其贤不及孔子。孔子曰：三人行，则必有我师。是故弟子不必不如师，师不必贤于弟子，闻道有先后，" +
                "术业有专攻，如是而已。李氏子蟠，年十七，好古文，六艺经传皆通习之，不拘于时，学于余。余嘉其能行古道，作《师说》以贻之。";
        // 要发送给服务器的信息
        Socket socket = new Socket("127.0.0.1",5710);
        socket.setSoTimeout(10000);
        OutputStream outputStream = socket.getOutputStream();
        int magic = 5710;
        for (int i= 0; i < 100; i++){
            byte [] data = context.getBytes();
            if(i == 1){
                String str = "{\"userName\":\"whx\",\"password\":\"123456\"}";
                data = MessageUtils.splicingMsg(CommandEnum.LOGIN_REQUEST.getCommand(),magic, str.getBytes());
//                data = MessageUtils.splicingMsg(CommandEnum.MESSAGE_REQUEST.getCommand(), SerializationAlgorithm.STR, str.getBytes());
                outputStream.write(data);
            }else{
                data = MessageUtils.splicingMsg(CommandEnum.MESSAGE_REQUEST.getCommand(),magic, data);
                outputStream.write(data);
            }
            // 从服务器接收的信息
            InputStream is = socket.getInputStream();

            byte [] head = new byte[9]; // 消息头长度11个
            // 读取消息头
            if(is.read(head) != -1){
                HeadInfo headInfo = MessageUtils.getHead(head);

                System.out.println("消息头" + headInfo.toJson());
                byte [] body = new byte[headInfo.getLength()];
                int len;
                if ((len = is.read(body)) != -1){
                    System.out.println(new String(body));
                }
            }
        }
    }
}
